package com.anfeng.cms.service.impl.attendance;

import com.anfeng.cms.common.Common;
import com.anfeng.cms.domain.attendance.AfRosterInfo;
import com.anfeng.cms.repository.mysql.dao.attendance.AfRosterInfoMapper;
import com.anfeng.cms.request.emp.RosterInfoReq;
import com.anfeng.cms.service.attendance.IAfRosterInfoService;
import com.anfeng.cms.util.IdGeneratorUtil;
import com.anfeng.cms.util.JsonMapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 吴朋
 * @since 2019-07-15
 */
@Service
@Slf4j
public class AfRosterInfoServiceImpl extends ServiceImpl<AfRosterInfoMapper, AfRosterInfo> implements IAfRosterInfoService {

    /**
     * 保存排班信息
     *
     * @param rosterInfo 排班信息
     * @return 排班id
     */
    @Override
    public String addRosterInfo(AfRosterInfo rosterInfo) {
        if (null == rosterInfo) {
            log.error("新增排班信息失败 参数不能为空");
            return null;
        }
        if (StringUtils.isBlank(rosterInfo.getName()) || (rosterInfo.getCross() != Common.ROSTER_CROSS_TYPE_OVERDAY &&
        rosterInfo.getCross() != Common.ROSTER_CROSS_TYPE_ONEDAY)) {
            log.error("新增排班信息失败 传入参数有误 {}", JsonMapper.defaultMapper().toJson(rosterInfo));
            return null;
        }
        // 根据名称查询是否存在
        RosterInfoReq infoReq = new RosterInfoReq();
        infoReq.setCross(rosterInfo.getCross());
        infoReq.setName(rosterInfo.getName());

        EntityWrapper<AfRosterInfo> wrapper = this.generatorRosterInfoWrapper(infoReq);
        AfRosterInfo dbRosterInfo = this.selectOne(wrapper);
        if (null != dbRosterInfo) {
            log.info("新增的排班信息已存在 无需再次添加 {}", JsonMapper.defaultMapper().toJson(dbRosterInfo));
            return dbRosterInfo.getId();
        }
        // 不存在 添加
        String rosterId = IdGeneratorUtil.uuid();
        rosterInfo.setId(rosterId);
        rosterInfo.setState(Common.DATA_STATE_NORMAL);
        Date currentDate = new Date();
        rosterInfo.setCreateTime(currentDate);
        rosterInfo.setModifiedTime(currentDate);
        boolean insert = this.insert(rosterInfo);
        if (!insert) {
            log.error("新增排班信息 保存数据库 失败 {}", JsonMapper.defaultMapper().toJson(rosterInfo));
            return null;
        }
        return rosterId;
    }

    /**
     * 根据班次名称和类型获取班次信息
     *
     * @param name 班次名称
     * @param type 类型 1 跨班 2 不跨班
     * @return 班次信息
     */
    @Override
    public AfRosterInfo getRosterInfo(String name, Integer type) {
        if (StringUtils.isBlank(name) || null == type || (type != Common.ROSTER_CROSS_TYPE_ONEDAY && type != Common.ROSTER_CROSS_TYPE_OVERDAY)) {
            log.error("根据名称和是否跨天 获取班次信息失败 参数为空");
            return null;
        }
        AfRosterInfo afRosterInfo = new AfRosterInfo();
        afRosterInfo.setName(name);
        afRosterInfo.setCross(type);
        afRosterInfo.setState(Common.DATA_STATE_NORMAL);
        EntityWrapper<AfRosterInfo> wrapper = new EntityWrapper<>();
        wrapper.setEntity(afRosterInfo);
        return this.selectOne(wrapper);
    }

    /**
     * 根据请求参数 获取排班信息数量
     *
     * @param infoReq 查询条件
     * @return 数量
     */
    @Override
    public int getAfRosterInfoCounts(RosterInfoReq infoReq) {
        EntityWrapper<AfRosterInfo> wrapper = this.generatorRosterInfoWrapper(infoReq);
        return this.selectCount(wrapper);
    }

    /**
     * 根据查询条件获取所有的排班信息
     *
     * @param infoReq 查询条件
     * @return 排班信息
     */
    @Override
    public List<AfRosterInfo> getRosterInfos(RosterInfoReq infoReq) {
        EntityWrapper<AfRosterInfo> wrapper = this.generatorRosterInfoWrapper(infoReq);
        return this.selectList(wrapper);
    }

    /**
     * 分页获取排班信息
     *
     * @param rosterInfoReq 查询条件
     * @param page          当前页
     * @param pageSize      每页数量
     * @return 排班信息
     */
    @Override
    public List<AfRosterInfo> getRosterInfosByPage(RosterInfoReq rosterInfoReq, Integer page, Integer pageSize) {
        Page<AfRosterInfo> pageInfo = this.generatorPageInfo(page, pageSize);
        EntityWrapper<AfRosterInfo> wrapper = this.generatorRosterInfoWrapper(rosterInfoReq);
        Page<AfRosterInfo> afRosterInfoPage = this.selectPage(pageInfo, wrapper);
        if (null == afRosterInfoPage || null == afRosterInfoPage.getRecords() || afRosterInfoPage.getRecords().isEmpty()) {
            return Collections.EMPTY_LIST;
        }
        return afRosterInfoPage.getRecords();
    }

    /**
     * 根据查询条件生成wrapper
     * @param rosterInfoReq 查询条件
     * @return wrapper
     */
    private EntityWrapper<AfRosterInfo> generatorRosterInfoWrapper(RosterInfoReq rosterInfoReq) {
        if (null == rosterInfoReq) {
            rosterInfoReq = new RosterInfoReq();
        }

        AfRosterInfo rosterInfo = new AfRosterInfo();
        rosterInfo.setCross(rosterInfoReq.getCross());
        rosterInfo.setName(rosterInfoReq.getName());
        rosterInfo.setState(Common.DATA_STATE_NORMAL);
        EntityWrapper<AfRosterInfo> wrapper = new EntityWrapper<>();
        wrapper.setEntity(rosterInfo);
        wrapper.orderBy("create_time", false);
        return wrapper;
    }

    /**
     * 根据页数 和 每页显示数量 生成 page对象
     * @param page 当前页
     * @param pageSize 每页数量
     * @return page对象
     */
    private Page<AfRosterInfo> generatorPageInfo(Integer page, Integer pageSize) {
        if (null == page || page < 1) {
            page = 1;
        }
        if (null == pageSize || pageSize < 10) {
            pageSize = 10;
        }

        Page<AfRosterInfo> rosterInfoPage = new Page<>();
        rosterInfoPage.setSize(pageSize);
        rosterInfoPage.setCurrent(page);
        return rosterInfoPage;
    }
}
